home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / comm / bbs / BBBBS84.lha / rexx / BuildALPHA.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1994-12-14  |  12.1 KB  |  485 lines

  1. /* $VER: BuildALPHA.rexx 8.3 (14.12.94)
  2. copyright 1990-94 Richard Lee Stockton
  3.         FREELY DISTRIBUTABLE
  4.  
  5. Build the main filelist "Lists/Files", and alphabetically
  6. sorted filelist "Lists/Files.ALPHA" from the filenotes.
  7.  
  8. KeyWords field (if empty) is built from the long description (if any).
  9. Bytes field is corrected (if necessary) to match real filesize.
  10.  
  11. If COLLECT is passed as an argument, will collect files that have
  12. no file description and construct descriptions for them using the
  13. filecomment of the file (if any) for note data. Note that the
  14. filecomment may then be blanked so it won't interfere with displays.
  15.  
  16. If NOFILEBUILD is passed as an argument, only the alpha list is built.
  17. You may NOT use both flags at once.
  18. */
  19.  
  20. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  21. IF ~SHOW('P','QuickSortPort') THEN CALL GETOUT(666)
  22.  
  23. ARG baflags .
  24.  
  25. IF baflags='?' THEN
  26.   DO
  27.     DO i=1 TO 14
  28.       SAY SOURCELINE(i)
  29.     END
  30.     EXIT
  31.   END
  32.  
  33. CALL OPENPORT('BUILDALPHA')
  34.  
  35. figarg='s:CONFIG.BBS'
  36. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  37. x=OPEN(f,figarg,'R')
  38. IF x=0 THEN
  39.   DO
  40.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  41.     EXIT(20)
  42.   END
  43. lynes.=''
  44. DO i=1 TO 8
  45.   lynes.i=READLN(f)
  46. END
  47. CALL CLOSE(f)
  48.  
  49. compos=POS('/*',lynes.1)
  50. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  51.  
  52. bbsname = STRIP(lynes.1)
  53. sysop   = WORD(lynes.2,1)
  54. bbspath = WORD(lynes.6,1)
  55. IF ~EXISTS(bbspath) THEN
  56.   DO
  57.     SAY 'The bbspath, 'bbspath', does not exist!'
  58.     EXIT(21)
  59.   END
  60. testchar=RIGHT(bbspath,1)
  61. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  62. libpath = WORD(lynes.8,1)
  63. IF ~EXISTS(libpath) THEN
  64.   DO
  65.     SAY 'The library path, 'libpath', does not exist!'
  66.     EXIT(22)
  67.   END
  68. testchar=RIGHT(libpath,1)
  69. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  70.  
  71. IF SHOW('P','BBBBS') THEN CALL PRAGMA('P',-2)
  72. etime=TIME('R')
  73.  
  74. IF baflags='COLLECT' THEN
  75.   DO
  76.     OPTIONS PROMPT 'Shall I clear each filecomment after using in the description? (Yn) > '
  77.     PULL clearflag .
  78.     clearflag=LEFT(STRIP(clearflag),1)
  79.     SAY 'Searching for files with no file descriptions...'
  80.     filelibs=SHOWDIR(libpath,'D')
  81.     DO i=1 TO WORDS(filelibs)
  82.       thislib=WORD(filelibs,i)
  83.       realfiles=SHOWDIR(libpath||thislib)
  84.       DO j=1 TO WORDS(realfiles)
  85.         thisfile=WORD(realfiles,j)
  86.         IF ~EXISTS(bbspath'FileNotes/'thislib'/'thisfile) THEN CALL makenote
  87.       END
  88.     END
  89.     IF ~DATATYPE(lastfile,'N') THEN
  90.       DO
  91.         SAY 'All files in the libraries have descriptions.'
  92.         EXIT
  93.       END
  94.   END
  95.  
  96. x=OPEN(f,bbspath'Lists/Libraries','R')
  97. IF x=0 THEN CALL GETOUT(24);
  98. libs.=''
  99. DO i=1
  100.   line=READLN(f)
  101.   IF EOF(f) THEN LEAVE i
  102.   indx=WORD(line,1)
  103.   IF ~DATATYPE(indx,'W') THEN ITERATE i
  104.   libs.indx=WORD(line,2)
  105. END
  106. CALL CLOSE(f)
  107.  
  108. f.=''
  109. cnt.=0
  110. latest=0
  111. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA.alpha','W') THEN CALL GETOUT(26)
  112. IF baflags='NOFILEBUILD' THEN SAY 'Rebuilding Files.ALPHA...'
  113. ELSE SAY 'Rebuilding Filelists...'
  114. DO i=1 TO 99
  115.   IF libs.i='' THEN ITERATE i
  116.   CALL MAKEDIR(libpath||libs.i)
  117.   notes=SHOWDIR(bbspath'FileNotes/'libs.i,'F')
  118.   DO j=1 TO WORDS(notes)
  119.     note=WORD(notes,j)
  120.     file=libpath||libs.i'/'note
  121.     IF ~EXISTS(file) THEN
  122.       DO
  123.         temp=WORD(STATEF(bbspath'FileNotes/'libs.i'/'note),8)
  124.         IF temp~='' THEN file=temp
  125.         IF ~EXISTS(file) THEN SAY file 'does not exist.'
  126.       END
  127.     IF OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')=0 THEN
  128.       DO
  129.         CALL CLOSE(f)
  130.         IF EXISTS(file) THEN
  131.           SAY 'Could not open file description for' libs.i'/'note
  132.         ELSE SAY file 'does not exist.'
  133.         ITERATE j
  134.       END
  135.     line=READLN(f)
  136.     PARSE VAR line 'File:' filenum 'KeyWords:' keywords
  137.     IF ~DATATYPE(filenum,'W') THEN
  138.       DO
  139.         CALL CLOSE(f)
  140.         SAY '*** Bad file description!' libs.i'/'note
  141.         SAY line
  142.         ITERATE j
  143.       END
  144.     filenum=filenum%1
  145.     line=READLN(f)
  146.     name=WORD(line,2)
  147.     notebytes=WORD(line,4)
  148.     IF LENGTH(keywords)<3 THEN
  149.       DO
  150.         CALL READLN(f)
  151.         CALL READLN(f)
  152.         line=READLN(f)
  153.         CALL CLOSE(f)
  154.         IF line~='' THEN
  155.           DO
  156.             keywords=STRIP(LEFT(line,32))
  157.             CALL fixkeywords()
  158.           END
  159.       END
  160.     ELSE CALL CLOSE(f)
  161.     IF POS('1B'x,keywords)>0 THEN
  162.       DO
  163.         keywords=strip_ansi(keywords)
  164.         CALL fixkeywords()
  165.       END
  166.     bytes=0
  167.     IF EXISTS(file) THEN
  168.       DO
  169.         bytes=WORD(STATEF(file),2)
  170.         IF bytes~=notebytes THEN CALL fixbytes()
  171.       END
  172.     ELSE bytes=notebytes
  173.     IF UPPER(name)~=UPPER(note) THEN CALL fixname()
  174.     IF f.filenum~='' THEN
  175.       DO
  176.         SAY 'Duplicate file numbers! 'filenum f.filenum '&' libs.i name
  177.         IF OPEN(na,bbspath'Numbers/LastFile','R')~=0 THEN
  178.           DO
  179.             newnum=READLN(na)
  180.             CALL CLOSE(na)
  181.             IF DATATYPE(newnum,'W') THEN
  182.               DO
  183.                 filenum=newnum+1
  184.                 SAY 'Adding' libs.i name 'to the filelists as file number' filenum'...'
  185.                 baflags=''
  186.                 IF OPEN(na,bbspath'Numbers/LastFile','W')~=0 THEN
  187.                   DO
  188.                     CALL WRITELN(na,filenum)
  189.                     CALL CLOSE(na)
  190.                   END
  191.               END
  192.           END
  193.       END
  194.     IF baflags~='NOFILEBUILD' THEN f.filenum=libs.i name
  195.     IF filenum>latest THEN latest=filenum
  196.     alpha=LEFT(name,22-LENGTH(bytes)) bytes RIGHT(filenum,5) RIGHT(i,2)
  197.     alpha=alpha LEFT(libs.i,12) TRIM(LEFT(STRIP(keywords),32))
  198.     CALL WRITELN(a,alpha)
  199.     cnt.i=cnt.i+1
  200.   END
  201.   lf1=libpath||libs.i'/.'STRIP(LEFT(libs.i,15))
  202.   CALL DELETE(lf1)
  203.   flg='W'
  204.   IF EXISTS(libpath||libs.i'.txt') THEN
  205.     DO
  206.       ADDRESS COMMAND 'COPY' libpath||libs.i'.txt' lf1
  207.       flg='A'
  208.     END
  209.   IF listOPEN(f,lf1,flg)=0 THEN ITERATE j
  210.   IF flg='A' THEN CALL WRITELN(f,'')
  211.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  212.   CALL WRITELN(f,LEFT('=',77,'='))
  213.   CALL CLOSE(f)
  214. END
  215. CALL CLOSE(a)
  216.  
  217. CALL SETCLIP('BBS_UPLOAD','NO')
  218.  
  219. IF baflags~='NOFILEBUILD' THEN
  220.   DO
  221.     IF ~listOPEN(f,bbspath'Lists/Files','W') THEN CALL GETOUT(27)
  222.     CALL SETCLIP('BBS_UPLOAD','NO')
  223.     SAY 'Saving Lists/Files...'
  224.     DO i=1 TO latest
  225.       IF f.i='' THEN ITERATE i
  226.       CALL WRITELN(f,i f.i)
  227.     END
  228.     CALL CLOSE(f)
  229.   END
  230.  
  231. a.=''
  232. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA.alpha','R') THEN CALL GETOUT(28)
  233. SAY 'Loading Lists/Files.ALPHA.alpha...'
  234. DO i=1
  235.   line=READLN(f)
  236.   IF EOF(f) THEN LEAVE i
  237.   a.i=line
  238. END
  239. CALL CLOSE(f)
  240. a.0=i-1
  241.  
  242. SAY 'Sorting...'
  243. CALL QSORT(1,a.0,a)
  244.  
  245. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','W') THEN CALL GETOUT(29)
  246. CALL DELETE(bbspath'Lists/Files.ALPHA.alpha')
  247. SAY 'Saving Lists/Files.ALPHA and individual library lists...'
  248. DO i=1 TO a.0
  249.   IF a.i='' THEN ITERATE i
  250.   CALL WRITELN(f,a.i)
  251.   lnum=WORD(a.i,4)
  252.   IF ~DATATYPE(lnum,'W') THEN ITERATE i
  253.   flg='W'
  254.   lf=libpath||libs.lnum'/.'STRIP(LEFT(libs.lnum,15))
  255.   IF EXISTS(lf) THEN flg='A'
  256.   IF ~OPEN(a,lf,flg) THEN ITERATE i
  257.   CALL WRITELN(a,a.i)
  258.   CALL CLOSE(a)
  259. END
  260. CALL CLOSE(f)
  261.  
  262. CALL SETCLIP('BBS_UPLOAD')
  263.  
  264. SAY 'Adding taglines to individual lists...'
  265. DO tt=1 TO 99
  266.   IF libs.tt='' THEN ITERATE tt
  267.   dname='.'STRIP(LEFT(libs.tt,15))
  268.   x=OPEN(f,libpath||libs.tt'/'dname,'A')
  269.   IF x~=0 THEN
  270.     DO
  271.       CALL WRITELN(f,LEFT('-',77,'-'))
  272.       temp='file'
  273.       IF cnt.tt~=1 THEN temp=temp's'
  274.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  275.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  276.       CALL WRITELN(f,temp)
  277.       CALL CLOSE(f)
  278.     END
  279.   CALL MAKEDIR(bbspath'FileNotes/'libs.tt)
  280.   fnote=bbspath'FileNotes/'libs.tt'/'dname
  281.   lynes.=''
  282.   lynes.0=5
  283.   x=OPEN(f,fnote,'R')
  284.   IF x~=0 THEN
  285.     DO
  286.       DO k=1
  287.         line=READLN(f)
  288.         IF EOF(f) THEN LEAVE k
  289.         lynes.k=line
  290.       END
  291.       CALL CLOSE(f)
  292.       lynes.0=k-1
  293.     END
  294.   finfo=STATEF(libpath||libs.tt'/.'STRIP(LEFT(libs.tt,15)))
  295.   bt=WORD(finfo,2)
  296.   dl=WORD(lynes.2,7)
  297.   IF ~DATATYPE(dl,'W') THEN dl=0
  298.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  299.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  300.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'libs.tt
  301.   lynes.4=LEFT('',74,'=')
  302.   IF lynes.5='' THEN
  303.     lynes.5='Up to the minute alphabetical filelist of the' libs.tt 'library.'
  304.   IF OPEN(f,fnote,'W')~=0 THEN
  305.     DO
  306.       DO k=1 TO lynes.0
  307.         CALL WRITELN(f,lynes.k)
  308.       END
  309.       CALL CLOSE(f)
  310.     END
  311. END
  312.  
  313. IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  314. IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  315. CALL GETOUT(0)
  316. EXIT
  317.  
  318.  
  319. /* sub-routines */
  320.  
  321. GETOUT:
  322. ARG outnum .
  323. IF outnum>0 THEN SAY 'Error number' outnum'.  Refer to BuildALPHA.rexx'
  324. mins=TIME('E')%60
  325. secs=TRUNC(TIME('E')//60)
  326. IF secs<10 THEN secs='0'secs
  327. SAY 'Elapsed time file building =' mins':'secs
  328. CALL SETCLIP('BBS_UPLOAD')
  329. EXIT(outnum);
  330.  
  331.  
  332. strip_ansi:
  333. PARSE ARG aline 
  334. n=POS('1B'x,aline)
  335. DO WHILE n>0
  336.   DO k=2
  337.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  338.       leave k
  339.   END
  340.   aline=DELSTR(aline,n,k+1)
  341.   n=POS('1B'x,aline)
  342. END
  343. RETURN aline
  344.  
  345.  
  346. fixname:
  347. SAY 'Name: field does not match actual filename!'
  348. SAY 'Changing Name: 'name' in file description to 'note
  349. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')
  350. IF x=0 THEN EXIT 20
  351. text.=''
  352. DO ii=1
  353.   x=READLN(F)
  354.   IF EOF(f) THEN LEAVE ii
  355.   text.ii=x
  356. END
  357. CALL CLOSE(f)
  358. text.0=ii-1
  359. text.2=OVERLAY(note,text.2,7,27)
  360. CALL DELAY(50)
  361. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'W')
  362. IF x=0 THEN EXIT 20
  363. DO ii=1 TO text.0
  364.   CALL WRITELN(f,text.ii)
  365. END
  366. CALL CLOSE(f)
  367. name=note
  368. RETURN
  369.  
  370.  
  371. fixkeywords:
  372. SAY 'Fixing keywords field for' libs.i'/'note
  373. fixfile=bbspath'FileNotes/'libs.i'/'note
  374. finfo=STATEF(fixfile)
  375. comment=''
  376. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  377. fxlines.=''
  378. x=OPEN(kf,fixfile,'R')
  379. IF x=0 THEN
  380.   DO
  381.     SAY 'Failed to open' fixfile 'for reading! (keywords adjustment)'
  382.     RETURN
  383.   END
  384. DO fx=1
  385.   line=READLN(kf)
  386.   IF EOF(kf) THEN LEAVE fx
  387.   fxlines.fx=line
  388. END
  389. CALL CLOSE(kf)
  390. fxlines.0=fx-1
  391. fxlines.1='File:' LEFT(WORD(fxlines.1,2),5) 'KeyWords:' keywords
  392. x=OPEN(kf,fixfile,'W')
  393. IF x=0 THEN
  394.   DO
  395.     SAY 'Failed to open' fixfile 'for writing! (keywords adjustment)'
  396.     RETURN
  397.   END
  398. DO fx=1 TO fxlines.0
  399.   CALL WRITELN(kf,fxlines.fx)
  400. END
  401. CALL CLOSE(kf)
  402. IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
  403. RETURN
  404.  
  405.  
  406. fixbytes:
  407. SAY 'Fixing bytes field for' libs.i'/'note
  408. fixfile=bbspath'FileNotes/'libs.i'/'note
  409. finfo=STATEF(fixfile)
  410. comment=''
  411. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  412. fxlines.=''
  413. x=OPEN(f,fixfile,'R')
  414. IF x=0 THEN
  415.   DO
  416.     SAY 'Failed to open' fixfile 'for reading! (byte adjustment)'
  417.     RETURN
  418.   END
  419. DO fx=1
  420.   line=READLN(f)
  421.   IF EOF(f) THEN LEAVE fx
  422.   fxlines.fx=line
  423. END
  424. CALL CLOSE(f)
  425. fxlines.0=fx-1
  426. fxlines.2=OVERLAY(bytes,fxlines.2,WORDINDEX(fxlines.2,4),LENGTH(bytes)+1)
  427. x=OPEN(f,fixfile,'W')
  428. IF x=0 THEN
  429.   DO
  430.     SAY 'Failed to open' fixfile 'for writing! (byte adjustment)'
  431.     RETURN
  432.   END
  433. DO fx=1 TO fxlines.0
  434.   CALL WRITELN(f,fxlines.fx)
  435. END
  436. CALL CLOSE(f)
  437. IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
  438. RETURN
  439.  
  440.  
  441. makenote:
  442. CALL MAKEDIR(bbspath'FileNotes/'thislib)
  443. x=OPEN(f,bbspath'FileNotes/'thislib'/'thisfile,'W')
  444. IF x=0 THEN
  445.   DO
  446.     SAY bbspath'FileNotes/'thislib'/'thisfile 'failed to open fro writing!'
  447.     RETURN
  448.   END
  449. x=OPEN(ff,bbspath'Numbers/LastFile','R')
  450. IF x~=0 THEN lastfile=READLN(ff)+1
  451. ELSE lastfile=1
  452. CALL CLOSE(ff)
  453. ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastFile 'lastfile
  454. finfo=STATEF(libpath||thislib'/'thisfile)
  455. bytes=WORD(finfo,2)
  456. comment=''
  457. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  458. CALL WRITELN(f,'File: 'LEFT(lastfile,5)' KeyWords:' STRIP(LEFT(comment,32)))
  459. CALL WRITELN(f,'Name: 'LEFT(thisfile,27)' Size: 'bytes' bytes   Downloads: 0')
  460. CALL WRITELN(f,'From: 'LEFT(sysop,27)' Date: 'DATE() TIME('C')'  Lib: 'thislib)
  461. CALL WRITELN(f,LEFT('',74,'='))
  462. IF LENGTH(comment)>31 THEN CALL WRITELN(f,comment)
  463. CALL CLOSE(f)
  464. IF comment~='' & clearflag~='N' THEN
  465.   ADDRESS COMMAND 'filenote' libpath||thislib'/'thisfile '22'x||'22'x
  466. SAY 'Added' thisfile 'to the' thislib 'library.'
  467. RETURN
  468.  
  469.  
  470. listOPEN:
  471. PARSE ARG fh,listfile,flag
  472. DO li=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  473.   IF li//4=0 THEN SAY 'Waiting' (60-li)*5 'more seconds for' listfile 'to become available...'
  474.   CALL DELAY(250)
  475. END
  476. IF li>59 THEN
  477.   DO
  478.     SAY '*** unable to access' listfile 'list.'
  479.     RETURN 0
  480.   END
  481. RETURN 1
  482.  
  483.  
  484. /* BuildALPHA.rexx */
  485.